/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import io.InformeDiarioDTO;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import ui.Fecha;

/**
 *Esta clase no representa una tabla en la base de datos, sino que fue hecha para
 * confeccionar de mejor forma la tabla primera de la pestaña Informe Diario
 * @author facundo
 */
public class InformeDiario {

    public ArrayList<InformeDiarioDTO> getPagosMes(String fecha1, String fecha2) throws DAOException {
        Connection conexion = null;
        try {

            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery(""
                    + "SELECT pago.fechaPago as fecha,sum(pago.montoPagado) as monto, cast('cuotas' AS CHAR CHARACTER SET utf8) as Tipo "
                    + " FROM pago WHERE (pago.fechaPago >= '" + fecha1 + "') "
                    + " AND (pago.fechaPago <= '" + fecha2 + "') "
                    + " GROUP BY (pago.fechaPago) DESC UNION "
                    + " SELECT venta.fecha,sum(venta.entrega)as monto, cast('motos' AS CHAR CHARACTER SET utf8) as Tipo "
                    + "     FROM venta WHERE (venta.fecha >= '" + fecha1 + "') "
                    + "         AND (venta.fecha <= '" + fecha2 + "') "
                    + "         AND ( venta.tipo = '" + "Motovehículo" + "') "
                    + "GROUP BY (venta.fecha) DESC UNION "
                    + "     SELECT venta.fecha,sum(venta.entrega)  as monto , cast('service' AS CHAR CHARACTER SET utf8) as Tipo"
                    + "     FROM `venta` WHERE (`venta`.`fecha` >= '" + fecha1 + "')"
                    + "      AND (`venta`.`fecha` <= '" + fecha2 + "')"
                    + "      AND ( venta.tipo = '" + "Services" + "') GROUP BY (`venta`.`fecha`) DESC UNION"
                    + "      SELECT venta.fecha,sum(venta.entrega)  as monto, cast('repuesto' AS CHAR CHARACTER SET utf8) as Tipo"
                    + " FROM `venta` WHERE (`venta`.`fecha` >= '" + fecha1 + "') AND (`venta`.`fecha` <= '" + fecha2 + "') "
                    + "AND ( venta.tipo = '" + "Repuestos" + "') GROUP BY (`venta`.`fecha`) DESC UNION "
                    + "SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('gestoría'AS CHAR CHARACTER SET utf8) as Tipo "
                    + "FROM `cajachica` WHERE (`cajachica`.`fecha` >= '" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "') "
                    + "AND ( cajachica.tipo = 1) GROUP BY (cajachica.fecha) DESC UNION "
                    + "SELECT tabla.fecha,sum(tabla.numCuotas*tabla.montoCuotas)- sum(tabla.precio)+ sum(tabla.entrega), cast('interes'AS CHAR CHARACTER SET utf8) as Tipo "
                    + "FROM(SELECT DISTINCT venta.fecha as fecha, venta.id as ventaId, venta.entrega as entrega, venta.precio as precio, plan.idVenta as idVentaPlan, "
                    + "plan.numCuotas, plan.montoCuotas, plan.idPlan FROM venta,plan "
                    + "WHERE (`venta`.`fecha` >= '" + fecha1 + "') AND (`venta`.`fecha` <= '" + fecha2 + "') AND (plan.idVenta = venta.id))as tabla "
                    + "GROUP BY tabla.fecha DESC"
                    + " UNION SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('gastosFijos'AS CHAR CHARACTER SET utf8) as Tipo "
                    + "FROM `cajachica` WHERE (`cajachica`.`fecha` >= '" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "')"
                    + " AND ( cajachica.tipo = 2) AND (cajachica.detalle = '" + "Gastos Fijos" + "' )GROUP BY (cajachica.fecha) DESC UNION"
                    + " SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('gastosVarios'AS CHAR CHARACTER SET utf8) as Tipo"
                    + " FROM `cajachica` WHERE (`cajachica`.`fecha` >= '" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "') AND "
                    + "( cajachica.tipo = 2) AND (cajachica.detalle = '" + "Gastos Varios" + "' ) GROUP BY (cajachica.fecha) DESC UNION"
                    + " SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('sueldos' AS CHAR CHARACTER SET utf8) as Tipo"
                    + " FROM `cajachica` WHERE (`cajachica`.`fecha` >='" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "') AND "
                    + "( cajachica.tipo = 2) AND (cajachica.detalle = '" + "Sueldo" + "' ) GROUP BY (cajachica.fecha) DESC ORDER BY fecha");
            ArrayList<InformeDiarioDTO> lista = new ArrayList();
            int contador = 0;
            while (rs.next()) {
                if (rs.getString("Tipo").equals("cuotas")) {
                    if (contador == 0) {
                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                        informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                        informeUnDia.setCuotas(rs.getDouble("monto"));
                        lista.add(informeUnDia);
                    } else {
                        InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                        if (informe != null) {
                            informe.setCuotas(rs.getDouble("monto"));
                        } else {
                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                            informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                            informeUnDia.setCuotas(rs.getDouble("monto"));
                            lista.add(informeUnDia);
                        }
                    }
                } else {
                    if (rs.getString("Tipo").equals("motos")) {
                        if (contador == 0) {
                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                            informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                            informeUnDia.setEntregas(rs.getDouble("monto"));
                            lista.add(informeUnDia);
                        } else {
                            InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                            if (informe != null) {
                                informe.setEntregas(rs.getDouble("monto"));
                            } else {
                                InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                informeUnDia.setEntregas(rs.getDouble("monto"));
                                lista.add(informeUnDia);
                            }
                        }
                    } else {
                        if (rs.getString("Tipo").equals("service")) {
                            if (contador == 0) {
                                InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                informeUnDia.setServices(rs.getDouble("monto"));
                                lista.add(informeUnDia);
                            } else {

                                InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                if (informe != null) {
                                    informe.setServices(rs.getDouble("monto"));
                                } else {
                                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                    informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                    informeUnDia.setServices(rs.getDouble("monto"));
                                    lista.add(informeUnDia);
                                }
                            }
                        } else {
                            if (rs.getString("Tipo").equals("repuesto")) {
                                if (contador == 0) {
                                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                    informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                    informeUnDia.setRepuestos(rs.getDouble("monto"));
                                    lista.add(informeUnDia);
                                } else {

                                    InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                    if (informe != null) {
                                        informe.setRepuestos(rs.getDouble("monto"));
                                    } else {
                                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                        informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                        informeUnDia.setRepuestos(rs.getDouble("monto"));
                                        lista.add(informeUnDia);
                                    }
                                }
                            } else {
                                if (rs.getString("Tipo").equals("gestoría")) {
                                    if (contador == 0) {
                                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                        informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                        informeUnDia.setGestoria(rs.getDouble("monto"));
                                        lista.add(informeUnDia);
                                    } else {

                                        InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                        if (informe != null) {
                                            informe.setGestoria(rs.getDouble("monto"));
                                        } else {
                                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                            informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                            informeUnDia.setGestoria(rs.getDouble("monto"));
                                            lista.add(informeUnDia);
                                        }
                                    }
                                } else {
                                    if (rs.getString("Tipo").equals("interes")) {
                                        if (contador == 0) {
                                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                            informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                            informeUnDia.setInterés(rs.getDouble("monto"));
                                            lista.add(informeUnDia);
                                        } else {

                                            InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                            if (informe != null) {
                                                informe.setInterés(rs.getDouble("monto"));
                                            } else {
                                                InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                informeUnDia.setInterés(rs.getDouble("monto"));
                                                lista.add(informeUnDia);
                                            }
                                        }
                                    } else {
                                        if (rs.getString("Tipo").equals("gastosFijos")) {
                                            if (contador == 0) {
                                                InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                informeUnDia.setGastosFijos(rs.getDouble("monto"));
                                                lista.add(informeUnDia);
                                            } else {

                                                InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                                if (informe != null) {
                                                    informe.setGastosFijos(rs.getDouble("monto"));
                                                } else {
                                                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                    informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                    informeUnDia.setGastosFijos(rs.getDouble("monto"));
                                                    lista.add(informeUnDia);
                                                }
                                            }
                                        } else {
                                            if (rs.getString("Tipo").equals("gastosVarios")) {
                                                if (contador == 0) {
                                                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                    informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                    informeUnDia.setGastosVarios(rs.getDouble("monto"));
                                                    lista.add(informeUnDia);
                                                } else {

                                                    InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                                    if (informe != null) {
                                                        informe.setGastosVarios(rs.getDouble("monto"));
                                                    } else {
                                                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                        informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                        informeUnDia.setGastosVarios(rs.getDouble("monto"));
                                                        lista.add(informeUnDia);
                                                    }
                                                }
                                            } else {
                                                if (rs.getString("Tipo").equals("sueldos")) {
                                                    if (contador == 0) {
                                                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                        informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                        informeUnDia.setSueldos(rs.getDouble("monto"));
                                                        lista.add(informeUnDia);
                                                    } else {

                                                        InformeDiarioDTO informe = InformeEnFecha(Fecha.formatearFecha(rs.getDate("fecha")), lista);
                                                        if (informe != null) {
                                                            informe.setSueldos(rs.getDouble("monto"));
                                                        } else {
                                                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                            informeUnDia.setFecha(Fecha.formatearFecha(rs.getDate("fecha")));
                                                            informeUnDia.setSueldos(rs.getDouble("monto"));
                                                            lista.add(informeUnDia);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                contador = contador + 1;
            }
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer los pagos de la cuota desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    private InformeDiarioDTO InformeEnFecha(String fecha, ArrayList<InformeDiarioDTO> lista) {
        InformeDiarioDTO informe = null;
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            InformeDiarioDTO informe2 = (InformeDiarioDTO) it.next();
            if (fecha.equals(informe2.getFecha().toString())) {
                informe = informe2;
            }
        }
        return informe;
    }

    public ArrayList<InformeDiarioDTO> getPagosMesResumen(String fecha1, String fecha2, String mesPalabra) throws DAOException {
        Connection conexion = null;
        try {

            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery(""
                    + "SELECT tabla.fecha as fecha, sum(tabla.monto) as monto, tabla.Tipo "
                    + "FROM (SELECT pago.fechaPago as fecha,sum(pago.montoPagado) as monto, cast('cuotas' AS CHAR CHARACTER SET utf8) as Tipo "
                    + " FROM pago WHERE (pago.fechaPago >= '" + fecha1 + "') "
                    + " AND (pago.fechaPago <= '" + fecha2 + "') "
                    + " GROUP BY (pago.fechaPago) DESC UNION "
                    + " SELECT venta.fecha,sum(venta.entrega)as monto, cast('motos' AS CHAR CHARACTER SET utf8) as Tipo "
                    + "     FROM venta WHERE (venta.fecha >= '" + fecha1 + "') "
                    + "         AND (venta.fecha <= '" + fecha2 + "') "
                    + "         AND ( venta.tipo = '" + "Motovehículo" + "') "
                    + "GROUP BY (venta.fecha) DESC UNION "
                    + "     SELECT venta.fecha,sum(venta.entrega)  as monto , cast('service' AS CHAR CHARACTER SET utf8) as Tipo"
                    + "     FROM `venta` WHERE (`venta`.`fecha` >= '" + fecha1 + "')"
                    + "      AND (`venta`.`fecha` <= '" + fecha2 + "')"
                    + "      AND ( venta.tipo = '" + "Services" + "') GROUP BY (`venta`.`fecha`) DESC UNION"
                    + "      SELECT venta.fecha,sum(venta.entrega)  as monto, cast('repuesto' AS CHAR CHARACTER SET utf8) as Tipo"
                    + " FROM `venta` WHERE (`venta`.`fecha` >= '" + fecha1 + "') AND (`venta`.`fecha` <= '" + fecha2 + "') "
                    + "AND ( venta.tipo = '" + "Repuestos" + "') GROUP BY (`venta`.`fecha`) DESC UNION "
                    + "SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('gestoría'AS CHAR CHARACTER SET utf8) as Tipo "
                    + "FROM `cajachica` WHERE (`cajachica`.`fecha` >= '" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "') "
                    + "AND ( cajachica.tipo = 1) GROUP BY (cajachica.fecha) DESC UNION "
                    + "SELECT tabla.fecha,sum(tabla.numCuotas*tabla.montoCuotas)- sum(tabla.precio)+ sum(tabla.entrega), cast('interes'AS CHAR CHARACTER SET utf8) as Tipo "
                    + "FROM(SELECT DISTINCT venta.fecha as fecha, venta.id as ventaId, venta.entrega as entrega, venta.precio as precio, plan.idVenta as idVentaPlan, "
                    + "plan.numCuotas, plan.montoCuotas, plan.idPlan FROM venta,plan "
                    + "WHERE (`venta`.`fecha` >= '" + fecha1 + "') AND (`venta`.`fecha` <= '" + fecha2 + "') AND (plan.idVenta = venta.id))as tabla "
                    + "GROUP BY tabla.fecha DESC"
                    + " UNION SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('gastosFijos'AS CHAR CHARACTER SET utf8) as Tipo "
                    + "FROM `cajachica` WHERE (`cajachica`.`fecha` >= '" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "')"
                    + " AND ( cajachica.tipo = 2) AND (cajachica.detalle = '" + "Gastos Fijos" + "' )GROUP BY (cajachica.fecha) DESC UNION"
                    + " SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('gastosVarios'AS CHAR CHARACTER SET utf8) as Tipo"
                    + " FROM `cajachica` WHERE (`cajachica`.`fecha` >= '" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "') AND "
                    + "( cajachica.tipo = 2) AND (cajachica.detalle = '" + "Gastos Varios" + "' ) GROUP BY (cajachica.fecha) DESC UNION"
                    + " SELECT cajachica.fecha,sum(cajachica.importe)  as monto, cast('sueldos' AS CHAR CHARACTER SET utf8) as Tipo"
                    + " FROM `cajachica` WHERE (`cajachica`.`fecha` >='" + fecha1 + "') AND (`cajachica`.`fecha` <= '" + fecha2 + "') AND "
                    + "( cajachica.tipo = 2) AND (cajachica.detalle = '" + "Sueldo" + "' ) GROUP BY (cajachica.fecha) DESC) as tabla GROUP BY tabla.Tipo");
            ArrayList<InformeDiarioDTO> lista = new ArrayList();
            int contador = 0;
            while (rs.next()) {
                if (rs.getString("Tipo").equals("cuotas")) {

                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                    informeUnDia.setFecha(mesPalabra);
                    informeUnDia.setCuotas(rs.getDouble("monto"));
                    lista.add(informeUnDia);
                } else {
                    if (rs.getString("Tipo").equals("motos")) {
                        if (contador == 0) {
                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                            informeUnDia.setFecha(mesPalabra);
                            informeUnDia.setEntregas(rs.getDouble("monto"));
                            lista.add(informeUnDia);
                        } else {
                            lista.get(0).setEntregas(rs.getDouble("monto"));
                        }
                    } else {
                        if (rs.getString("Tipo").equals("service")) {
                            if (contador == 0) {
                                InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                informeUnDia.setFecha(mesPalabra);
                                informeUnDia.setServices(rs.getDouble("monto"));
                                lista.add(informeUnDia);
                            } else {
                                lista.get(0).setServices(rs.getDouble("monto"));
                            }
                        } else {
                            if (rs.getString("Tipo").equals("repuesto")) {
                                if (contador == 0) {
                                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                    informeUnDia.setFecha(mesPalabra);
                                    informeUnDia.setRepuestos(rs.getDouble("monto"));
                                    lista.add(informeUnDia);
                                } else {
                                    lista.get(0).setRepuestos(rs.getDouble("monto"));
                                }
                            } else {
                                if (rs.getString("Tipo").equals("gestoría")) {
                                    if (contador == 0) {
                                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                        informeUnDia.setFecha(mesPalabra);
                                        informeUnDia.setGestoria(rs.getDouble("monto"));
                                        lista.add(informeUnDia);
                                    } else {
                                        lista.get(0).setGestoria(rs.getDouble("monto"));
                                    }
                                } else {
                                    if (rs.getString("Tipo").equals("interes")) {
                                        if (contador == 0) {
                                            InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                            informeUnDia.setFecha(mesPalabra);
                                            informeUnDia.setInterés(rs.getDouble("monto"));
                                            lista.add(informeUnDia);
                                        } else {
                                            lista.get(0).setInterés(rs.getDouble("monto"));
                                        }
                                    } else {
                                        if (rs.getString("Tipo").equals("gastosFijos")) {
                                            if (contador == 0) {
                                                InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                informeUnDia.setFecha(mesPalabra);
                                                informeUnDia.setGastosFijos(rs.getDouble("monto"));
                                                lista.add(informeUnDia);
                                            } else {
                                                lista.get(0).setGastosFijos(rs.getDouble("monto"));
                                            }
                                        } else {
                                            if (rs.getString("Tipo").equals("gastosVarios")) {
                                                if (contador == 0) {
                                                    InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                    informeUnDia.setFecha(mesPalabra);
                                                    informeUnDia.setGastosVarios(rs.getDouble("monto"));
                                                    lista.add(informeUnDia);
                                                } else {
                                                    lista.get(0).setGastosVarios(rs.getDouble("monto"));
                                                }
                                            } else {
                                                if (rs.getString("Tipo").equals("sueldos")) {
                                                    if (contador == 0) {
                                                        InformeDiarioDTO informeUnDia = new InformeDiarioDTO();
                                                        informeUnDia.setFecha(mesPalabra);
                                                        informeUnDia.setSueldos(rs.getDouble("monto"));
                                                        lista.add(informeUnDia);
                                                    } else {
                                                        lista.get(0).setSueldos(rs.getDouble("monto"));
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                contador = contador + 1;
            }
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
}
